/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.northwestern.cbits.activitydetector.app;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.ActivityRecognitionResult;
import com.google.android.gms.location.DetectedActivity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TextView;
import junit.framework.Test;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
/**
* Sample application that demonstrates the use of
* ActivityRecognitionClient}. It registers for activity detection updates
* at a rate of 1 seconds, logs them to a file, and displays the detected
* activities with their associated confidence levels.
* An IntentService receives activity detection updates in the background
* so that detection can continue even if the Activity is not visible.
*/
public class MainActivity extends Activity {
// setup UI refresh handler
int i = 0;
TextView nameView;
final Handler mHandler = new Handler();
// Store the current request type (ADD or REMOVE)
public ActivityUtils.REQUEST_TYPE mRequestType;
// The activity recognition update request object
public DetectionRequester mDetectionRequester;
// The activity recognition update removal object
public DetectionRemover mDetectionRemover;
private void UpdateGUI() {
i++;
final MainActivity me = this;
// Runs once a second
mHandler.post(new Runnable() {
public void run() {
Log.d(getString(R.string.app_name),
ActivityRecognitionIntentService.ACTIVITY_NAME);
nameView.setText(ActivityRecognitionIntentService.ACTIVITY_NAME + " " + System.currentTimeMillis() / 1000);
//setting up tone for on_foot
Uri defaultRingtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(me, defaultRingtoneUri);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mediaPlayer.prepare();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
if (ActivityRecognitionIntentService.ACTIVITY_NAME == "on_foot") {
mediaPlayer.start();
} else {
mediaPlayer.release();
}
} catch (IOException e) {
e.printStackTrace();
}
;
}
});
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get detection requester and remover objects
mDetectionRequester = new DetectionRequester(this);
mDetectionRemover = new DetectionRemover(this);
mDetectionRequester.requestUpdates();
// Set the main layout
setContentView(R.layout.activity_main);
nameView = (TextView) this.findViewById(R.id.activity);
nameView.setText(ActivityRecognitionIntentService.ACTIVITY_NAME);
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {UpdateGUI();}
}, 0, 1000);
}
/*
* Handle results returned to this Activity by other Activities started with
* startActivityForResult(). In particular, the method onConnectionFailed() in
* DetectionRemover and DetectionRequester may call startResolutionForResult() to
* start an Activity that handles Google Play services problems. The result of this
* call returns here, to onActivityResult.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
// Choose what to do based on the request code
switch (requestCode) {
// If the request code matches the code sent in onConnectionFailed
case ActivityUtils.CONNECTION_FAILURE_RESOLUTION_REQUEST :
switch (resultCode) {
// If Google Play services resolved the problem
case Activity.RESULT_OK:
// If the request was to start activity recognition updates
if (ActivityUtils.REQUEST_TYPE.ADD == mRequestType) {
// Restart the process of requesting activity recognition updates
mDetectionRequester.requestUpdates();
// If the request was to remove activity recognition updates
} else if (ActivityUtils.REQUEST_TYPE.REMOVE == mRequestType ){
/*
* Restart the removal of all activity recognition updates for the
* PendingIntent.
*/
mDetectionRemover.removeUpdates(
mDetectionRequester.getRequestPendingIntent());
}
break;
// If any other result was returned by Google Play services
default:
// Report that Google Play services was unable to resolve the problem.
Log.d(ActivityUtils.APPTAG, getString(R.string.no_resolution));
}
// If any other request code was received
default:
// Report that this Activity received an unknown requestCode
Log.d(ActivityUtils.APPTAG,
getString(R.string.unknown_activity_request_code, requestCode));
break;
}
}
/*
* Register the broadcast receiver and update the log of activity updates
*/
@Override
protected void onResume() {
super.onResume();
// Check for Google Play services
if (!servicesConnected()) {
return;
}
/*
* Set the request type. If a connection error occurs, and Google Play services can
* handle it, then onActivityResult will use the request type to retry the request
*/
mRequestType = ActivityUtils.REQUEST_TYPE.ADD;
// Pass the update request to the requester object
mDetectionRequester.requestUpdates();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
/*
* Unregister the receiver during a pause
*/
@Override
protected void onPause() {
super.onPause();
}
/**
* Verify that Google Play services is available before making a request.
*
* @return true if Google Play services is available, otherwise false
*/
private boolean servicesConnected() {
// Check that Google Play services is available
int resultCode =
GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
// If Google Play services is available
if (ConnectionResult.SUCCESS == resultCode) {
// In debug mode, log the status
Log.d(ActivityUtils.APPTAG, getString(R.string.play_services_available));
// Continue
return true;
// Google Play services was not available for some reason
} else {
// Display an error dialog
GooglePlayServicesUtil.getErrorDialog(resultCode, this, 0).show();
return false;
}
}
}